package pe.edu.sistemas.postgrado.samupg.domain.model;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "ficha_inscripcion", catalog = "bd_samupg")
public class FichaInscripcion implements java.io.Serializable {

    private Integer fiId;
    private Usuario usuario;
    private Periodo periodo;
    private MaestriaDiplomado maestriaDiplomado;
    private String fiEspecialidad;
    private String fiInstitucion;
    private String fiGrado;
    private RegistroNotas registroNotas;
    private Boolean fiPago;
    private String fiCodinscripcion;
    private List<Documento> documentos = new ArrayList<Documento>(0);

    public FichaInscripcion() {
    }

    public FichaInscripcion(Usuario usuario, Periodo periodo, MaestriaDiplomado maestriaDiplomado) {
        this.usuario = usuario;
        this.periodo = periodo;
        this.maestriaDiplomado = maestriaDiplomado;
    }

    public FichaInscripcion(Usuario usuario, Periodo periodo, MaestriaDiplomado maestriaDiplomado, String fiEspecialidad, String fiInstitucion, String fiGrado, RegistroNotas registroNotas, List<Documento> documentos) {
        this.usuario = usuario;
        this.periodo = periodo;
        this.maestriaDiplomado = maestriaDiplomado;
        this.fiEspecialidad = fiEspecialidad;
        this.fiInstitucion = fiInstitucion;
        this.fiGrado = fiGrado;
        this.registroNotas = registroNotas;
        this.documentos = documentos;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "fi_id", unique = true, nullable = false)
    public Integer getFiId() {
        return this.fiId;
    }

    public void setFiId(Integer fiId) {
        this.fiId = fiId;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "fi_usu_id", nullable = false)
    public Usuario getUsuario() {
        return this.usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "fi_periodo_id", nullable = false)
    public Periodo getPeriodo() {
        return this.periodo;
    }

    public void setPeriodo(Periodo periodo) {
        this.periodo = periodo;
    }

    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "fi_md_id", nullable = false)
    public MaestriaDiplomado getMaestriaDiplomado() {
        return this.maestriaDiplomado;
    }

    public void setMaestriaDiplomado(MaestriaDiplomado maestriaDiplomado) {
        this.maestriaDiplomado = maestriaDiplomado;
    }

    @Column(name = "fi_especialidad", length = 45)
    public String getFiEspecialidad() {
        return this.fiEspecialidad;
    }

    public void setFiEspecialidad(String fiEspecialidad) {
        this.fiEspecialidad = fiEspecialidad;
    }

    @Column(name = "fi_institucion", length = 45)
    public String getFiInstitucion() {
        return this.fiInstitucion;
    }

    public void setFiInstitucion(String fiInstitucion) {
        this.fiInstitucion = fiInstitucion;
    }

    @Column(name = "fi_grado", length = 45)
    public String getFiGrado() {
        return this.fiGrado;
    }

    public void setFiGrado(String fiGrado) {
        this.fiGrado = fiGrado;
    }

    @Column(name = "fi_pago")
    public Boolean getFiPago() {
        return this.fiPago;
    }

    public void setFiPago(Boolean fiPago) {
        this.fiPago = fiPago;
    }

    @Column(name = "fi_codinscripcion", length = 6)
    public String getFiCodinscripcion() {
        return this.fiCodinscripcion;
    }

    public void setFiCodinscripcion(String fiCodinscripcion) {
        this.fiCodinscripcion = fiCodinscripcion;
    }

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "fichaInscripcion")
    public RegistroNotas getRegistroNotas() {
        return this.registroNotas;
    }

    public void setRegistroNotas(RegistroNotas registroNotas) {
        this.registroNotas = registroNotas;
    }

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "fichaInscripcion")
    @Fetch(value = FetchMode.SUBSELECT)
    public List<Documento> getDocumentos() {
        return this.documentos;
    }

    public void setDocumentos(List<Documento> documentos) {
        this.documentos = documentos;
    }
}
